const webpack = require('webpack')
const CompressionWebpackPlugin = require('compression-webpack-plugin')
let pages = require('./build/getPages.js')
const pagesArray = require('./build/pages.js')
const productionGzipExtensions = ['js', 'css']
const path = require('path')
function resolve(dir) {
  return path.join(__dirname, dir)
}
module.exports = {
  runtimeCompiler: true, //是否使用包含运行时编译器的 Vue 构建版本
  publicPath: '',
  pages,
  productionSourceMap: false, //不在production环境使用SourceMap
  devServer: {
    //跨域
    port: 8080, // 端口号
    open: true, //配置自动启动浏览器
    proxy: {
      // 配置跨域处理 可以设置多个
      '/client': {
        target: 'https://app-api-0.com/'
        // pathRewrite: { '^/api': '' },
        // ws: true,
        // changeOrigin: true
      }
    }
  },
  configureWebpack: {
    resolve: {
      alias: {
        '@': resolve('src')
      }
    },
    plugins: [
      new CompressionWebpackPlugin({
        algorithm: 'gzip',
        test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
        threshold: 10240,
        minRatio: 0.8
      }),
      new webpack.optimize.LimitChunkCountPlugin({
        maxChunks: 5,
        minChunkSize: 100
      })
    ],
    optimization: {
      splitChunks: {
        chunks: 'all',
        minSize: 20000, // 允许新拆出 chunk 的最小体积，也是异步 chunk 公共模块的强制拆分体积
        maxAsyncRequests: 6, // 每个异步加载模块最多能被拆分的数量
        maxInitialRequests: 6, // 每个入口和它的同步依赖最多能被拆分的数量
        enforceSizeThreshold: 50000, // 强制执行拆分的体积阈值并忽略其他限制
        cacheGroups: {
          libs: {
            // 第三方库
            name: 'chunk-libs',
            test: /[\\/]node_modules[\\/]/,
            priority: 10
            // chunks: "initial" // 只打包初始时依赖的第三方
          },
          vant: {
            // vant 单独拆包
            name: 'chunk-vant',
            test: /[\\/]node_modules[\\/]vant[\\/]/,
            priority: 20 // 权重要大于 libs
          },
          jsencrypt: {
            // jsencrypt 单独拆包
            name: 'chunk-jsencrypt',
            test: /[\\/]node_modules[\\/]jsencrypt[\\/]/,
            priority: 30 // 权重要大于 libs
          },
          // svgIcon: {
          //   // svg 图标
          //   name: 'chunk-svgIcon',
          //   test(module) {
          //     // `module.resource` 是文件的绝对路径
          //     // 用`path.sep` 代替 / or \，以便跨平台兼容
          //     // const path = require('path') // path 一般会在配置文件引入，此处只是说明 path 的来源，实际并不用加上
          //     return (
          //       module.resource &&
          //       module.resource.endsWith('.svg') &&
          //       module.resource.includes(`${path.sep}icons${path.sep}`)
          //     )
          //   },
          //   priority: 30
          // },
          commons: {
            // 公共模块包
            name: `chunk-commons`,
            minChunks: 2,
            priority: 0,
            reuseExistingChunk: true
          }
        }
      }
    }
  },
  chainWebpack(config) {
    // config.plugins.delete('preload-login')
    // config.plugins.delete('preload-home')
    // svg设置
    pagesArray.forEach(item => {
      const icons = `src/views/${item.pagePath}/icons`
      config.module.rule('svg').exclude.add(resolve(icons)).end()
      config.module
        .rule('icons')
        .test(/\.svg$/)
        .include.add(resolve(icons))
        .end()
        .use('svg-sprite-loader')
        .loader('svg-sprite-loader')
        .options({
          symbolId: 'icon-[name]'
        })
        .end()
    })

    config.when(process.env.NODE_ENV !== 'development', config => {
      config.optimization.minimizer('terser').tap(args => {
        args[0].terserOptions.compress.drop_console = true
        args[0].terserOptions.compress.warnings = false
        args[0].terserOptions.compress.drop_debugger = true
        return args
      })
    })
  }
}
